package saves.items;

import game.LScript;
import game.TextManager;

public class Efeito {

    private int codStatus, codBonus, operador;
    private float valor, tempoRestante;
    
    private Efeito() {}

    public Efeito(int codStatus, int codBonus, int operador, float valor, float tempoRestante) {
        this.codStatus = codStatus;
        this.codBonus = codBonus;
        this.operador = operador;
        this.valor = valor;
        this.tempoRestante = tempoRestante;
    }
    
    public boolean tick(int delta) {
        if (tempoRestante == -1)
            return false;
        if (tempoRestante <= delta)
            return true;
        tempoRestante -= delta;
        return false;
    }

    public void atualizar(int deltaT) {
        this.tempoRestante -= deltaT;
    }

    public boolean apply(int c1, int c2) {
        return codStatus == c1 && codBonus == c2;
    }

    public float modificar(float valor) {
        switch (operador) {
            case 0:
                return valor + this.valor;
            case 1:
                return valor * this.valor;
            case 2:
                return Math.min(valor, this.valor);
            case 3:
                return Math.max(valor, this.valor);
            default:
                return valor;
        }
    }
    
    public String getOperatorString() {
        switch (operador) {
            case 0:
                return "+";
            case 1:
                return "*";
            case 2:
                return "min";
            case 3:
                return "max";
            default:
                return null;
        }
    }
    
    @Override
    public String toString() {
        return TextManager.t().ATTRIBUTES[codStatus][codBonus] + " " + getDescription();
    }
    
    public String getDescription() {
        return getOperatorString() + " " + LScript.format(this.valor) + (tempoRestante != 0 ? " for " + LScript.format(tempoRestante) + "s" : "");
    }
    
    @Override
    public boolean equals(Object o) {
        if (o instanceof Efeito) {
            Efeito e = (Efeito) o;
            return e.codStatus == codStatus && e.codBonus == codBonus && e.operador == operador && e.tempoRestante == tempoRestante && e.valor == valor;
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 83 * hash + this.codStatus;
        hash = 83 * hash + this.codBonus;
        hash = 83 * hash + this.operador;
        hash = 83 * hash + Float.floatToIntBits(this.valor);
        hash = 83 * hash + Float.floatToIntBits(this.tempoRestante);
        return hash;
    }
}
